package user

import (
	"context"
	"goHelpers/app/entity"
	"goHelpers/app/model"
	"goHelpers/helper/config"

	"gorm.io/gorm"
)

// userModel 模型结构体
type userModel struct {
	Ctx context.Context
	db  *gorm.DB
}

// NewModel 实例化模型结构体
func NewModel(ctx context.Context) *userModel {
	// 获取数据库名称
	dbName, _ := config.GetConfigByName("app.db.dbName").(string)
	return &userModel{ctx, model.NewDB(ctx, dbName).DB}
}

// table 表名称
func (m *userModel) table() string {
	return "user"
}

// GetInfoByUserName 通过用户名查询信息
func (m *userModel) GetInfoByUserName(username string) (rdata *entity.User) {

	// 查询
	err := m.db.Table(m.table()).Where("username = ?", username).Find(&rdata).Error
	if err != nil {
		model.CheckMysqlError(err)
	}
	return
}

// GetInfoByUserId 通过Id查询信息
func (m *userModel) GetInfoByUserId(user_id uint32) (rdata *entity.User) {

	// 查询
	err := m.db.Table(m.table()).Where("id = ?", user_id).Find(&rdata).Error
	if err != nil {
		model.CheckMysqlError(err)
	}
	return
}

// Register 注册
func (m *userModel) Register(req *entity.User) (affectedRows int64) {
	// 写入
	res := m.db.Table(m.table()).Where("username = ?", req.Username).Create(&req)
	if res.Error != nil {
		model.CheckMysqlError(res.Error)
	}
	return res.RowsAffected
}

// List 获取列表
func (m *userModel) List(req *entity.PageParams) (rdata []*entity.UserInfo, total int64) {
	// 排序
	order := "id desc"

	// 统计
	err := m.db.Table(m.table()).Select("id").Order(order).Count(&total).Error
	if err != nil {
		model.CheckMysqlError(err)
	}

	// 查询
	err2 := m.db.Table(m.table()).Select("id", "username", "sex", "create_time").Order(order).Limit(req.Limit).Offset(req.Offset).Find(&rdata).Error
	if err2 != nil {
		model.CheckMysqlError(err2)
	}
	return
}
